www.gusucode.com > matlab从零到进阶程序与数据 > matlab从零到进阶程序与数据/第10章 数值积分计算/nIntegrate.m
function f = nIntegrate(fun,low,up) %f, 返回值,n重积分积分结果 %fun, 是被积函数字符串形式; %low存储从外到内各重积分的积分下限函数; %up存储从外到内各重积分的积分上限函数(都是字符串形式) %为了保证函数正常运行,low和up内的函数遵循如下原则:设积分重数为m,最内层到最外层的 %积分变量依次以xm,...x2,x1来表示(只能以这样顺序,其他顺序或者别的字母表示变量都不可以) %最内层的上下限函数不管是不是关于x(m-1)的函数都要求x(m-1)必须出现,不是其函数时 %可以写成“+0*x(m-1)”等形式,依次类推次内层要求x(m-2)必须要出现等等,一直到次外层 %要求变量x1出现,最外层才是常数。 N = length(low); %判断积分重数 fun = vectorize(fun); %将被积函数写成点乘形式,方便数值积分函数调用 if verLessThan('MATLAB','7.8') %判断当前运行该函数的MATLAB版本是否低于7.8即R2009a %低于7.8调用GenerateExpr_quadl函数递归构造求解表达式 expr = GenerateExpr_quadl(N); else %7.8或者以后的版本调用GenerateExpr_quad2d函数递归构造求解表达式 if mod(N,2) == 0 expr = GenerateExpr_quad2d(N); else expr = ['quadl(@(x1) arrayfun(@(x1)',... GenerateExpr_quad2d(N-1),',x1),',low{1},',',up{1},')']; end end %======================================================= %主要利用quadl函数递归构造求解表达式,适用于R2009a以前的版本 %======================================================= function expr = GenerateExpr_quadl(n) if n == 1 expr = ['quadl(@(x',num2str(N),')',fun,',',low{N},',',up{N},')' ]; else expr = ['quadl(@(x',num2str(N-n+1),') arrayfun(@(x',... num2str(N-n+1),')',GenerateExpr_quadl(n-1),',x',num2str(N-n+1),... '),',low{N-n+1},',',up{N-n+1},')']; end end %============================================================ %主要利用quad2d函数递归构造求解表达式,适用于R2009a以及以后的版本 %============================================================ function expr = GenerateExpr_quad2d(n) if n == 2 expr = ['quad2d(@(x',num2str(N-1),',x',num2str(N),')',fun,',',... low{N-1},',',up{N-1},',@(x',num2str(N-1),')',low{N},',@(x',... num2str(N-1),')',up{N},')' ]; else expr = ['quad2d(@(x',num2str(N-n+1),',x',num2str(N-n+2),')',... 'arrayfun(@(x',num2str(N-n+1),',x',num2str(N-n+2),')',... GenerateExpr_quad2d(n-2),... ',x',num2str(N-n+1),',x',num2str(N-n+2),'),',... low{N-n+1},',',up{N-n+1},... ',@(x',num2str(N-n+1),')',low{N-n+2},... ',@(x',num2str(N-n+1),')',up{N-n+2},')' ]; end end f = eval(expr); end